/* function factorial(n) {
    if (n === 1) return 1;
    return n * factorial(n - 1);
  }
  
  factorial(5) // 120 */
  function factorial(n,total){
      if(n===1) return total
      return factorial(n-1,n*total)
  }

  factorial(5,1)

//可以看到，每一次返回的就是一个新的函数，不带上一个函数的参数，也就不需要储存上一个函数了。尾递归只需要保存一个调用栈，复杂度 O(1)

//数组求和
function sumArray(arr,total){
    if(arr.length===1){
        return total
    }
    return sumArray(arr,total+arr.pop())
}
//使用尾递归优化求斐波那契数列
function factorial(n,start=1,total=1){
    if(n<=2){
        return total
    }
    return factorial(n-1,total,total+start)
}
//数字扁平化
function flat(arr=[],result=[]){
    arr.forEach(v => {
        if(Array.isArray(v)){
            result=result.concat(flat(v,[]))
        }else{
            result.push(v)
        }
    });
    return result
}